#pragma once

#include <vector> 
#include <list>
#include <deque>

// 虽然说队列也是一个容器适配器,但是顺序表和vector这一个数据结构并不能很好的适配queue
// 所以,在模板配置的时候就需要使用list来作为缺省参数来实现
// 为了实现容器适配的功能,c++在实现两个数据结构之外,还发明了一种deque(双端队列)这一种可以同时适配stack和queue的结构
// deque是上面两种结构的结合体,中庸的有则查询还算快,能插入还算快的特性
// 但是,它并不是物理上的真正的数据结构,而是利用迭代器实现的一种虚拟的数据结构(了解即可)

namespace gojo
{

    // 适配器/配接器
    // 容器适配器

    template<class T , class Container = deque<T>>
    class queue
    {

        private:

            container _con ;

        public:

    // 增

            void push (const T& x)
            {

                _con.push_back (x) ;

            }

    
    // 删

            void pop ()
            {

                _con.pop_front () ;

            }

    
    // 查

        size_t size () const
        {

            return _con.size () ;

        }

        bool empty () const
        {

            return _con.empty () ;

        }

        const T& front () const
        {

            return _con.front () ;

        }

        T& front ()
        {

            return _con.front () ;

        }

        const T& back () const
        {

            return _con.back () ;

        }

        T& back ()
        {

            return _con.back () ;

        }
        
    }

}